/**
 * async 和 await 相比直接使用 Promise 来说，优势在于处理 then 的调用链，能够更清晰准确的写出代码。
 * 缺点在于滥用 await 可能会导致性能问题，因为 await 会阻塞代码，也许之后的异步代码并不依赖于前者，但仍然需要等待前者完成，导致代码失去了并发性。
 */
var a = 0
var b = async () => {
    a = a + await 10
    console.log('2--', a);
    
    a = (await 10) + a
    console.log('3--', a);
}
b()
a++
console.log('1--', a); 
/**
 * 输出：
 * 1-- 1
 * 2-- 10
 * 3-- 20
 */

/**
 * 首先函数 b 先执行，在执行到 await 10 之前变量 a 还是 0，
 * 因为在 await 内部实现 generators ，generators 会保留堆栈中东西，所以这时候 a = 0 被保存了下来.
 * 因为 await 是异步操作，遇到 await 就会立即返回一个 pending 状态的Promise对象，暂时返回执行代码的控制权，使得函数外的代码得以继续执行，
 * 所以会先执行 console.log('1--', a)
 * 这时候同步代码执行完毕，开始执行异步代码，将保存下来的值(a = 0)拿出来使用，这时候 a = 10
 * 然后后面就是常规执行代码了
 *  */
